Zelf gedeclareerde structs
Structs worden gebruikt voor kleine datastructuren die waarden betekenen of voorstellen, bijvoorbeeld complexe getallen in coördinatensysteem. Het belangrijkste is dat de structs niet al teveel gegevensonderdelen (members) bevat en dat er niet van moet kunnen worden overgeërfd en geen referentiële identiteit vereisen. Ze maken gebruik van ‘value semantics’, dit wil zeggen dat een assignment de waarde kopieert i.p.v. een referentie.
De eenvoudige types in C#, zoals int, double, bool enz. zijn eigenlijk allemaal structs.
Het waardetype structs kan constructors, constanten, velden, methoden, eigenschappen, indexes, operatoren, events en geneste types bevatten. De declaratie van structs is van de volgende vorm:
[attributes] [modifiers] struct identifier [:interfaces] body [;]
Je kunt het keyword struct gebruiken om een struct te declareren (simpel hè?). De algemene vorm van een struct gaat als volgt.
struct { //Structure members }
Bijvoorbeeld:
public struct Point { private int x, y; public Point(int p1, int p2) { x = p1; y = p2; } }
De
- public,
- protected,
- internal en
- private.
Je kunt overigens ook nog attributen gebruiken. Deze komen voor de
Een modifier heeft dezelfde betekenis als bij een class declaratie. Je kunt dus niet meerdere modifiers op een struct declaratie toepassen. Het is niet mogelijk om abstracte of gesloten (sealed) modifiers te gebruiken. In de meeste gevallen zul je een public struct creëren.
In een klasse is het mogelijk om een veld/variabele te creëren en deze direct een waarde toe te kennen. In een structure is een dergelijke initialisatie niet mogelijk. De velden moeten geïnitialiseerd worden via functies, of door het object zelf te gebruiken. De volgende code levert dus een fout op:
struct Point { public int x = 20; // Fout: het is niet mogelijk een veld te initialiseren public int y=20; // Fout: het is niet mogelijk een veld te initialiseren }
Maar een struct kan wel static fields bevatten, die in een struct geïnitialiseerd kan worden.
struct Point { public static int x = 25; public static int y = 50; }
Een C# struct kan ook methoden bevatten. Deze methoden kunnen zowel statisch als niet-statisch zijn. Het is dan wel zo dat statische methoden alleen statische (struct-)members kan benaderen en je kunt ze niet aanroepen via een instantie van de structure. Je kunt ze alleen via de struct-naam benaderen.
struct Point { static int x = 25; static int y = 50; public void SetXY(int i, int j) { x = i; y = j; } public static void ShowSum() { int sum = x + y; Console.WriteLine("De som is {0}",sum); } // struct declaration and initialization using System; public struct Point { public int x, y; public Point(int p1, int p2) { x = p1; y = p2; } } class MainClass { public static void Main() { // Declare Point myPoint = new Point(); // Declare and Initialize: Point yourPoint = new Point(10,10); // Display results: Console.Write("My Point: "); Console.WriteLine("x = {0}, y = {1}", myPoint.x, myPoint.y); Console.Write("Your Point: "); Console.WriteLine("x = {0}, y = {1}", yourPoint.x, yourPoint.y); } }
Output
My Point: x = 0, y = 0 Your Point: x = 10, y = 10 // Declare a struct object without "new" using System; public struct Point { public int x, y; public Point(int x, int y) { this.x = x; this.y = y; } } class MainClass { public static void Main() { // Declare an object: Point myPoint; // Initialize: myPoint.x = 10; myPoint.y = 20; // Display results: Console.WriteLine("My Point:"); Console.WriteLine("x = {0}, y = {1}", myPoint.x, myPoint.y); } }
Output
My Point: x = 10, y = 20 // struct declaration and initialization using System; public struct Point { public int x, y; public Point(int p1, int p2) { x = p1; y = p2; } public void WriteCoordinatesToScreen() { Console.Write("My Point: "); Console.WriteLine("x = {0}, y = {1}", x, y); } } class MainClass { public static void Main() { // Declare Point myPoint = new Point(); // Declare and Initialize: Point yourPoint = new Point(10,10); // Display results: myPoint.WriteCoordinatesToScreen(); yourPoint.WriteCoordinatesToScreen(); } }